﻿/**
 * Copyright (C) 2013 original author and authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NGuice.Inject.Spi;
using NGuice.Inject.Internal.Util;

namespace NGuice.Inject.Internal
{
    /// <summary>
    /// 返回尚未初始化的提供者和成员注入器。此查找器对于初始化创建注入器的一部分是必要的
    /// </summary>
    public class DeferredLookups : ILookups
    {
        private readonly InjectorImpl injector;
        private readonly List<IElement> lookups = Lists.NewArrayList<IElement>();

        public DeferredLookups(InjectorImpl injector)
        {
            this.injector = injector;
        }

        /// <summary>
        /// 立即或当注入器被创建时初始化特定的lookups
        /// </summary>
        /// <param name="errors"></param>
        internal void Initialize(Errors errors)
        {
            injector.lookups = injector;
            new LookupProcessor(errors).Process(injector, lookups);
        }

        public IProvider<T> GetProvider<T>(Key<T> key)
        {
            ProviderLookup<T> lookup = new ProviderLookup<T>(key, key);
            lookups.Add(lookup);
            return lookup.Provider;
        }

        public IMembersInjector<T> GetMembersInjector<T>()
        {
            MembersInjectorLookup<T> lookup = new MembersInjectorLookup<T>(typeof(T));
            lookups.Add(lookup);
            return lookup.MembersInjector;
        }
    }
}
